package org.rudirect.android.api;
import android.util.Log;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
import org.rudirect.android.data.constants.AppData;
import org.rudirect.android.data.model.BusData;
import org.rudirect.android.data.model.BusRoute;
import org.rudirect.android.data.model.BusStop;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class NextBusAPI {
private static final String TAG = NextBusAPI.class.getSimpleName();
private static OkHttpClient okHttpClient;
private static SAXParser saxParser;
// Downloads data from a url and returns it as an input stream
private static InputStream downloadUrl(String url) {
if (okHttpClient == null) {
okHttpClient = new OkHttpClient();
}
Request request = new Request.Builder().url(url).build();
try {
Response response = okHttpClient.newCall(request).execute();
return response.body().byteStream();
} catch (IOException e) {
Log.e(TAG, e.toString(), e);
}
return null;
}
// Setups the SAX parser and parses the XML from the url
private static void parseXML(String url, DefaultHandler handler) {
try {
if (saxParser == null) {
SAXParserFactory factory = SAXParserFactory.newInstance();
saxParser = factory.newSAXParser();
}
InputStream inputStream = downloadUrl(url);
if (inputStream == null) {
throw new IOException("Can't connect to the Internet");
} else {
saxParser.parse(inputStream, handler);
}
} catch (IOException | SAXException | ParserConfigurationException e) {
Log.e(TAG, e.toString());
}
}
// Saves the bus routes to the database
public static void saveBusRoutes() {
parseXML(AppData.ALL_ROUTES_URL, new XMLBusRouteHandler());
}
// Saves the bus stop times to the database
public static void saveBusStopTimes(BusRoute route) {
BusStop[] busStops = route.getBusStops();
if (busStops != null) {
// Create predictions link
StringBuilder link = new StringBuilder(AppData.PREDICTIONS_URL);
for (BusStop stop : busStops) {
link.append("&stops=").append(route.getTag()).append("%7Cnull%7C").append(stop.getTag());
}
// Log.d("NextBus API", link.toString());
parseXML(link.toString(), new XMLBusTimesHandler(route));
}
}
// Updates active routes
public static void updateActiveRoutes() {
parseXML(AppData.VEHICLE_LOCATIONS_URL, new XMLActiveRoutesHandler());
}
// Returns an array of the active routes
public static ArrayList<BusRoute> getActiveRoutes() {
updateActiveRoutes();
return BusData.getActiveRoutes();
}
}